<?php

/**
 * Gen Global UniqueID
 *
 * @author littlexiang
 */
class Lib_UniqueID {

    /**
     * @return string 96 bit (12 byte) long global unique id
     */
    public static function getUniqueID() {
        //since 2014-07-25 00:00:00
        $epoch = 1406217600;
        $ts = microtime(true);
        $epoch_ts = intval(floor(($ts - $epoch) * 1000)); //45 bit
//        var_dump(strtotime('3000-01-01') * 1000);
//        var_dump(pow(2, 45));
        $machine_id = substr(md5(php_uname('n')), 0, 3); //24 bit
        $pid = posix_getpid() % 0xFFFF; //16 bit
        $rand = mt_rand(0, 2047); //11 bit
        $guid = self::gmp_shiftl($epoch_ts, 51);
        $guid = gmp_or($guid, self::gmp_shiftl($machine_id, 27));
        $guid = gmp_or($guid, self::gmp_shiftl($pid, 11));
        $guid = gmp_or($guid, gmp_init($rand));

//        var_dump(gmp_strval($guid));
//        var_dump(gmp_strval(self::gmp_shiftr(gmp_strval($guid), 51)));
        return gmp_strval($guid, 62);
    }

    public static function gmp_shiftl($x, $n) { // shift left
        $x = gmp_init($x);

        return (gmp_mul($x, gmp_pow(2, $n)));
    }

//    public static function gmp_shiftr($x, $n) { // shift right
//        $x = gmp_init($x);
//
//        return (gmp_div($x, gmp_pow(2, $n)));
//    }
}
